Manager 提供了可以进行所有数据类型共享的机制,就是可以以 dict list …… 类型进行进程的通信

在 Manager 中数据是不安全的因为 Manager 中没有锁的机制,多个进程修改同一块数据时,就会导致数据的混乱,处理方式上锁

from multiprocessing import Manager
from multiprocessing import Process


def fun(dic):
    print(dic, '子进程') # {'count': 0} 子进程


if __name__ == '__main__':
    m = Manager()
    d = m.dict({})  # 创建一个共享的字典
    print(d, '主进程')  # {} 主进程
    d['count'] = 0
    print(d, '主进程') # {'count': 0} 主进程
    p = Process(target=fun, args=(d,))  # 将共享字典传递给子进程,从而实现进程之间的通信,普通的字典是不行的一定要是 Manager 创建的
    p.start()
    p.join()  # 注意,子进程必须执行 .join() 方法,这样在子进程里面才能获取到字典不然只能获取到一个对象

在 Manager 中如果一个进程修改了共享的数据,那么另一个进程是会感知到的

from multiprocessing import Manager
from multiprocessing import Process
from multiprocessing import Lock


def work(dic, lock):
    lock.acquire()  # 上锁

    dic['count'] -= 1  # 当共享的数据被修改了,其他进程是可以感知到的
    print(dic, '子进程')

    lock.release()  # 解锁


if __name__ == '__main__':
    lock = Lock()
    m = Manager()
    dic = m.dict({'count': 100})  # 创建一个共享字典
    l = []
    for i in range(100):
        p = Process(target=work, args=(dic, lock))
        p.start()
        l.append(p)

    [i.join() for i in l]  # 子进程必须执行 .join() 方法,这样在子进程里面才能获取到字典不然只能获取到一个对象
    print(dic, '--------- 主进程 ---------')